function unpack_cplx(filename_in,filename_out)
% This function unpacks the SiGe complex data and writes it to filename_out

% Sets file ids
fid = fopen(filename_in,'rb');
fid_out = fopen(filename_out,'wb');

% Sets piece as arbitrary amount read-in at a time
piece = 4e6;
% Finds file size
fseek(fid,0,1);
nword = (ftell(fid));
fseek(fid,0,-1);
% Calculates number of loops from file size over size of data read in at
% one time
nl = ceil(nword/piece);
% Begins a waitbar
h = waitbar(0,['Unpacking SiGe...']);

% Look-up tables, essentially for every packed value from 1-256, look-up 
% tables give unpacked value for Is and Qs
LUT_I_long1 = [1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3;1;-1;1;-1;3;-3;3;-3];
LUT_I_long2 = [1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3];
LUT_Q_long1 = [1;1;-1;-1;1;1;-1;-1;3;3;-3;-3;3;3;-3;-3;1;1;-1;-1;1;1;-1;-1;3;3;-3;-3;3;3;-3;-3;1;1;-1;-1;1;1;-1;-1;3;3;-3;-3;3;3;-3;-3;1;1;-1;-1;1;1;-1;-1;3;3;-3;-3;3;3;-3;-3;1;1;-1;-1;1;1;-1;-1;3;3;-3;-3;3;3;-3;-3;1;1;-1;-1;1;1;-1;-1;3;3;-3;-3;3;3;-3;-3;1;1;-1;-1;1;1;-1;-1;3;3;-3;-3;3;3;-3;-3;1;1;-1;-1;1;1;-1;-1;3;3;-3;-3;3;3;-3;-3;1;1;-1;-1;1;1;-1;-1;3;3;-3;-3;3;3;-3;-3;1;1;-1;-1;1;1;-1;-1;3;3;-3;-3;3;3;-3;-3;1;1;-1;-1;1;1;-1;-1;3;3;-3;-3;3;3;-3;-3;1;1;-1;-1;1;1;-1;-1;3;3;-3;-3;3;3;-3;-3;1;1;-1;-1;1;1;-1;-1;3;3;-3;-3;3;3;-3;-3;1;1;-1;-1;1;1;-1;-1;3;3;-3;-3;3;3;-3;-3;1;1;-1;-1;1;1;-1;-1;3;3;-3;-3;3;3;-3;-3;1;1;-1;-1;1;1;-1;-1;3;3;-3;-3;3;3;-3;-3];
LUT_Q_long2 = [1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;-1;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3;-3];

% Loop through and unpack data and write to file
for n = 0:nl-1
    % Just here to catch remainder if piece does not divide nicely into the
    % size of the file
    npiece = min(piece,nword-n*piece);
    % Read the data from the opened file - fid
    data = fread(fid, npiece,'uint8'); 
    % Pre-allocates
    data_2file = zeros(4*numel(data),1);
    % Uses look-up tables to unpack data
    data_2file(1:4:end) = LUT_I_long1(data+1);
    data_2file(2:4:end) = LUT_Q_long1(data+1);
    data_2file(3:4:end) = LUT_I_long2(data+1);
    data_2file(4:4:end) = LUT_Q_long2(data+1);
    % Writes to file in signed characters
    fwrite(fid_out,data_2file,'schar');
    % Updates waitbar
    waitbar((n+1)/(nl),h);
end
% Closes files and waitbar
fclose(fid);
fclose(fid_out);
close(h);